﻿2026-05-14T10:46:33.9773718Z ##[group]Run pnpm verify:phase-5
2026-05-14T10:46:33.9774041Z [36;1mpnpm verify:phase-5[0m
2026-05-14T10:46:33.9795124Z shell: /usr/bin/bash -e {0}
2026-05-14T10:46:33.9795376Z env:
2026-05-14T10:46:33.9795627Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-14T10:46:33.9795959Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-14T10:46:33.9796189Z   SKIP_TRACE_CHECK: 1
2026-05-14T10:46:33.9796400Z ##[endgroup]
2026-05-14T10:46:34.2760435Z 
2026-05-14T10:46:34.2762621Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-14T10:46:34.2763545Z > node scripts/verify-phase-5.mjs
2026-05-14T10:46:34.2764007Z 
2026-05-14T10:46:34.3130034Z 
2026-05-14T10:46:34.3131244Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-14T10:46:34.3132053Z >>> pnpm verify:phase-4
2026-05-14T10:46:34.6511581Z 
2026-05-14T10:46:34.6532073Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-14T10:46:34.6535634Z > node scripts/verify-phase-4.mjs
2026-05-14T10:46:34.6551273Z 
2026-05-14T10:46:34.6903458Z 
2026-05-14T10:46:34.6904011Z === Workspace: typecheck ===
2026-05-14T10:46:34.6904919Z >>> pnpm -r typecheck
2026-05-14T10:46:35.0000184Z Scope: 5 of 6 workspace projects
2026-05-14T10:46:35.0054490Z packages/db typecheck$ tsc --noEmit
2026-05-14T10:46:35.0063399Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T10:46:37.6024120Z packages/game-logic typecheck: Done
2026-05-14T10:46:37.6032060Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T10:46:39.8755388Z packages/db typecheck: Done
2026-05-14T10:46:41.1648021Z packages/protocol typecheck: Done
2026-05-14T10:46:41.1654589Z apps/client typecheck$ tsc --noEmit
2026-05-14T10:46:41.1657635Z apps/server typecheck$ tsc --noEmit
2026-05-14T10:46:52.5474386Z apps/client typecheck: Done
2026-05-14T10:46:53.3509121Z apps/server typecheck: Done
2026-05-14T10:46:53.3602887Z 
2026-05-14T10:46:53.3603396Z === Lint: protocol-sync ===
2026-05-14T10:46:53.3604059Z >>> pnpm lint:protocol-sync
2026-05-14T10:46:53.6570768Z 
2026-05-14T10:46:53.6572003Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-14T10:46:53.6573049Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-14T10:46:53.6573589Z 
2026-05-14T10:46:53.6861588Z lint-protocol-sync: OK
2026-05-14T10:46:53.6980186Z 
2026-05-14T10:46:53.6991992Z === Lint: game-logic-purity ===
2026-05-14T10:46:53.6994803Z >>> pnpm lint:game-logic-purity
2026-05-14T10:46:53.9961835Z 
2026-05-14T10:46:53.9972514Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-14T10:46:53.9976601Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-14T10:46:53.9977168Z 
2026-05-14T10:46:54.0258247Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-14T10:46:54.0366623Z 
2026-05-14T10:46:54.0367168Z === Lint: better-auth-schema-sync ===
2026-05-14T10:46:54.0368169Z >>> pnpm lint:better-auth-schema-sync
2026-05-14T10:46:54.3344333Z 
2026-05-14T10:46:54.3345281Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-14T10:46:54.3346568Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-14T10:46:54.3347372Z 
2026-05-14T10:46:55.7917518Z lint-better-auth-schema-sync: OK
2026-05-14T10:46:55.8049739Z 
2026-05-14T10:46:55.8050378Z === Lint: rate-limit-budgets ===
2026-05-14T10:46:55.8051571Z >>> pnpm lint:rate-limit-budgets
2026-05-14T10:46:56.1005680Z 
2026-05-14T10:46:56.1006689Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-14T10:46:56.1007953Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-14T10:46:56.1008644Z 
2026-05-14T10:46:56.1312116Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-14T10:46:56.1432434Z 
2026-05-14T10:46:56.1436678Z === Lint: no-clipboard-rce ===
2026-05-14T10:46:56.1437497Z >>> pnpm lint:no-clipboard-rce
2026-05-14T10:46:56.4386639Z 
2026-05-14T10:46:56.4387710Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-14T10:46:56.4388933Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-14T10:46:56.4389605Z 
2026-05-14T10:46:56.4715951Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-14T10:46:56.4834942Z 
2026-05-14T10:46:56.4835483Z === Lint: room-layout ===
2026-05-14T10:46:56.4836231Z >>> pnpm lint:room-layout
2026-05-14T10:46:56.7796988Z 
2026-05-14T10:46:56.7797998Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-14T10:46:56.7799142Z > node tools/scripts/lint-room-layout.mjs
2026-05-14T10:46:56.7799712Z 
2026-05-14T10:46:56.8147316Z lint-room-layout: OK
2026-05-14T10:46:56.8261837Z 
2026-05-14T10:46:56.8262331Z === ADR 0004 lint ===
2026-05-14T10:46:56.8263023Z >>> pnpm lint:adr:0004
2026-05-14T10:46:57.1226606Z 
2026-05-14T10:46:57.1227598Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-14T10:46:57.1229570Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-14T10:46:57.1230525Z 
2026-05-14T10:46:57.1528078Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T10:46:57.1637741Z 
2026-05-14T10:46:57.1638232Z === Drizzle: emit-check ===
2026-05-14T10:46:57.1639045Z >>> pnpm db:emit-check
2026-05-14T10:46:57.4570519Z 
2026-05-14T10:46:57.4571813Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-14T10:46:57.4575052Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-14T10:46:57.4577248Z 
2026-05-14T10:46:57.8926841Z No config path provided, using default 'drizzle.config.ts'
2026-05-14T10:46:57.8929272Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-14T10:46:58.2517390Z 8 tables
2026-05-14T10:46:58.2518172Z accounts 8 columns 1 indexes 0 fks
2026-05-14T10:46:58.2519088Z audit_log 6 columns 0 indexes 2 fks
2026-05-14T10:46:58.2520021Z characters 9 columns 0 indexes 1 fks
2026-05-14T10:46:58.2521222Z inventory_items 4 columns 0 indexes 1 fks
2026-05-14T10:46:58.2522268Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-14T10:46:58.2523145Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-14T10:46:58.2524101Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-14T10:46:58.2524996Z sessions 5 columns 0 indexes 1 fks
2026-05-14T10:46:58.2525562Z 
2026-05-14T10:46:58.2526450Z No schema changes, nothing to migrate 😴
2026-05-14T10:46:58.3511442Z 
2026-05-14T10:46:58.3512202Z === Drizzle: schema-sync ===
2026-05-14T10:46:58.3513007Z >>> pnpm lint:schema-sync
2026-05-14T10:46:58.6673528Z 
2026-05-14T10:46:58.6674512Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-14T10:46:58.6678032Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-14T10:46:58.6680607Z 
2026-05-14T10:46:58.6931158Z OK
2026-05-14T10:46:58.7052517Z 
2026-05-14T10:46:58.7053099Z === Drizzle: source-comments ===
2026-05-14T10:46:58.7053867Z >>> pnpm lint:source-comments
2026-05-14T10:46:59.0051444Z 
2026-05-14T10:46:59.0052712Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-14T10:46:59.0053952Z > pnpm -C packages/db run lint:source-comments
2026-05-14T10:46:59.0054672Z 
2026-05-14T10:46:59.3267599Z 
2026-05-14T10:46:59.3268535Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-14T10:46:59.3269797Z > node scripts/check-source-comments.mjs
2026-05-14T10:46:59.3270489Z 
2026-05-14T10:46:59.3579178Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-14T10:46:59.3778838Z 
2026-05-14T10:46:59.3779346Z === Workspace: test ===
2026-05-14T10:46:59.3780041Z >>> pnpm -r test
2026-05-14T10:46:59.6789431Z Scope: 5 of 6 workspace projects
2026-05-14T10:46:59.6844338Z packages/db test$ vitest run
2026-05-14T10:46:59.6853139Z packages/game-logic test$ vitest run
2026-05-14T10:47:00.1834310Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T10:47:00.2032695Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T10:47:00.6233123Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-14T10:47:00.8598760Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:47:01.0874799Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T10:47:01.1520529Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:47:01.3159377Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:01.5330647Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:01.7492974Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:01.9481220Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:47:02.0587700Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:02.1687476Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:47:02.2867845Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:02.2926760Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T10:47:02.2954258Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T10:47:02.2955363Z packages/db test: [2m   Start at [22m 10:47:00
2026-05-14T10:47:02.2969561Z packages/db test: [2m   Duration [22m 2.10s[2m (transform 169ms, setup 0ms, import 1.46s, tests 30ms, environment 1ms)[22m
2026-05-14T10:47:02.3236149Z packages/db test: Done
2026-05-14T10:47:02.3248901Z packages/protocol test$ vitest run
2026-05-14T10:47:02.3872998Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:47:02.6133846Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:47:02.6231375Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T10:47:02.6262513Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T10:47:02.6373289Z packages/game-logic test: [2m   Start at [22m 10:47:00
2026-05-14T10:47:02.6482610Z packages/game-logic test: [2m   Duration [22m 2.40s[2m (transform 197ms, setup 0ms, import 388ms, tests 87ms, environment 2ms)[22m
2026-05-14T10:47:02.6736231Z packages/game-logic test: Done
2026-05-14T10:47:02.7857281Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T10:47:03.0658980Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T10:47:03.2269236Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:03.3872988Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:47:03.5330290Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:47:03.5398869Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T10:47:03.5400556Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T10:47:03.5402172Z packages/protocol test: [2m   Start at [22m 10:47:02
2026-05-14T10:47:03.5403938Z packages/protocol test: [2m   Duration [22m 745ms[2m (transform 117ms, setup 0ms, import 216ms, tests 30ms, environment 0ms)[22m
2026-05-14T10:47:03.5695031Z packages/protocol test: Done
2026-05-14T10:47:03.5702098Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T10:47:03.5703391Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T10:47:04.0998955Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T10:47:04.1703763Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T10:47:05.1502944Z apps/server test: {"level":30,"time":1778755625144,"pid":4689,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T10:47:05.1509523Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 752[2mms[22m[39m
2026-05-14T10:47:05.1548259Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 594[2mms[22m[39m
2026-05-14T10:47:06.0045099Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T10:47:06.0052557Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T10:47:06.0834053Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 239[2mms[22m[39m
2026-05-14T10:47:06.3826922Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 65[2mms[22m[39m
2026-05-14T10:47:07.2773712Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T10:47:07.2802106Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-UDVKwC/rebno.db
2026-05-14T10:47:07.2803799Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:47:07.2805653Z apps/server test: [run-migrations] OK
2026-05-14T10:47:07.2937145Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 130[2mms[22m[39m
2026-05-14T10:47:07.2941503Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T10:47:07.2952474Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-KKTYMY/rebno.db
2026-05-14T10:47:07.2954267Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:47:07.2956527Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T10:47:07.2958008Z apps/server test: [run-migrations] OK
2026-05-14T10:47:07.3049069Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:47:07.3058000Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-XY7633/rebno.db
2026-05-14T10:47:07.3078862Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:47:07.3080288Z apps/server test: [run-migrations] OK
2026-05-14T10:47:07.3083571Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:47:07.3085524Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-XY7633/rebno.db
2026-05-14T10:47:07.3088015Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:47:07.3089738Z apps/server test: [run-migrations] OK
2026-05-14T10:47:07.3138957Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 63[2mms[22m[39m
2026-05-14T10:47:07.6018416Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T10:47:07.8962833Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-14T10:47:08.1827783Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-14T10:47:08.4720538Z apps/server test: {"level":40,"time":1778755628465,"pid":4801,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:47:08.4762856Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:47:08.4799587Z apps/server test: {"level":40,"time":1778755628468,"pid":4801,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:47:08.4822328Z apps/server test: {"level":40,"time":1778755628469,"pid":4801,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:47:08.4945973Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 160[2mms[22m[39m
2026-05-14T10:47:08.7045014Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:47:08.9836507Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-14T10:47:09.7099233Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 109[2mms[22m[39m
2026-05-14T10:47:09.8015145Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T10:47:09.8037526Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ secrets for agents [www.dotenvx.com]
2026-05-14T10:47:09.8065143Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T10:47:10.6018074Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:10.8185986Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 106[2mms[22m[39m
2026-05-14T10:47:10.8458745Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:10.8546084Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T10:47:10.8547707Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T10:47:10.8569052Z apps/server test: [2m   Start at [22m 10:47:04
2026-05-14T10:47:10.8574552Z apps/server test: [2m   Duration [22m 6.74s[2m (transform 481ms, setup 0ms, import 3.42s, tests 1.00s, environment 6ms)[22m
2026-05-14T10:47:10.9065351Z apps/server test: Done
2026-05-14T10:47:11.5490813Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 71[2mms[22m[39m
2026-05-14T10:47:12.2337537Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 40[2mms[22m[39m
2026-05-14T10:47:12.9098864Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:47:13.5854580Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 31[2mms[22m[39m
2026-05-14T10:47:14.2529657Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T10:47:14.9928264Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:47:15.6954126Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-14T10:47:16.3488371Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:17.0180760Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:47:17.6625022Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:18.3046573Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:18.9565658Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:19.6145891Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:47:20.2897403Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:47:20.9382840Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:47:21.6084901Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:47:22.2584834Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:47:22.9140131Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:47:23.5523755Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:47:24.2317971Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:47:24.9037863Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-14T10:47:24.9242383Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T10:47:24.9249096Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T10:47:24.9266702Z apps/client test: [2m   Start at [22m 10:47:04
2026-05-14T10:47:24.9269888Z apps/client test: [2m   Duration [22m 20.75s[2m (transform 777ms, setup 61ms, collect 1.20s, tests 1.03s, environment 12.15s, prepare 2.30s)[22m
2026-05-14T10:47:25.0572220Z apps/client test: Done
2026-05-14T10:47:25.0636059Z 
2026-05-14T10:47:25.0636808Z verify-phase-4: OK (12 steps green)
2026-05-14T10:47:25.0745404Z 
2026-05-14T10:47:25.0745871Z === Workspace: typecheck ===
2026-05-14T10:47:25.0746714Z >>> pnpm -r typecheck
2026-05-14T10:47:25.3776949Z Scope: 5 of 6 workspace projects
2026-05-14T10:47:25.3830858Z packages/db typecheck$ tsc --noEmit
2026-05-14T10:47:25.3839770Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T10:47:28.0022599Z packages/game-logic typecheck: Done
2026-05-14T10:47:28.0079029Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T10:47:30.0285065Z packages/db typecheck: Done
2026-05-14T10:47:31.4466416Z packages/protocol typecheck: Done
2026-05-14T10:47:31.4473514Z apps/server typecheck$ tsc --noEmit
2026-05-14T10:47:31.4476355Z apps/client typecheck$ tsc --noEmit
2026-05-14T10:47:42.9848808Z apps/client typecheck: Done
2026-05-14T10:47:43.6390808Z apps/server typecheck: Done
2026-05-14T10:47:43.6479513Z 
2026-05-14T10:47:43.6479910Z === Lint: deploy-stack ===
2026-05-14T10:47:43.6480531Z >>> pnpm lint:deploy-stack
2026-05-14T10:47:43.9451988Z 
2026-05-14T10:47:43.9452943Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-14T10:47:43.9453907Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-14T10:47:43.9454448Z 
2026-05-14T10:47:43.9786634Z lint-deploy-stack: OK
2026-05-14T10:47:43.9901593Z 
2026-05-14T10:47:43.9902101Z === Lint: deploy-stack test ===
2026-05-14T10:47:43.9902796Z >>> pnpm lint:deploy-stack:test
2026-05-14T10:47:44.2867730Z 
2026-05-14T10:47:44.2868775Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-14T10:47:44.2870094Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-14T10:47:44.2870712Z 
2026-05-14T10:47:44.3449162Z PASS: lint-deploy-stack green
2026-05-14T10:47:44.3570323Z 
2026-05-14T10:47:44.3571437Z === ADR 0005 lint ===
2026-05-14T10:47:44.3572237Z >>> pnpm lint:adr:0005
2026-05-14T10:47:44.6529999Z 
2026-05-14T10:47:44.6531399Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-14T10:47:44.6533094Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-14T10:47:44.6534066Z 
2026-05-14T10:47:44.6823264Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T10:47:44.6932632Z 
2026-05-14T10:47:44.6933115Z === ADR 0006 lint ===
2026-05-14T10:47:44.6933844Z >>> pnpm lint:adr:0006
2026-05-14T10:47:44.9901542Z 
2026-05-14T10:47:44.9902540Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-14T10:47:44.9904090Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-14T10:47:44.9905148Z 
2026-05-14T10:47:45.0200732Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T10:47:45.0308847Z 
2026-05-14T10:47:45.0309326Z === Workspace: test ===
2026-05-14T10:47:45.0310001Z >>> pnpm -r test
2026-05-14T10:47:45.3310015Z Scope: 5 of 6 workspace projects
2026-05-14T10:47:45.3363724Z packages/db test$ vitest run
2026-05-14T10:47:45.3372435Z packages/game-logic test$ vitest run
2026-05-14T10:47:45.8368271Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T10:47:45.8421952Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T10:47:46.2657688Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-14T10:47:46.5108538Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:47:46.7322301Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T10:47:46.7924148Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:47:46.9666743Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:47.0433186Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:47.1925063Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:47.4065996Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:47.6131518Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:47:47.8177042Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:47:47.9118887Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:47.9362268Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T10:47:47.9364034Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T10:47:47.9474501Z packages/db test: [2m   Start at [22m 10:47:45
2026-05-14T10:47:47.9476595Z packages/db test: [2m   Duration [22m 2.07s[2m (transform 163ms, setup 0ms, import 1.43s, tests 31ms, environment 0ms)[22m
2026-05-14T10:47:47.9515345Z packages/db test: Done
2026-05-14T10:47:47.9522344Z packages/protocol test$ vitest run
2026-05-14T10:47:48.0603579Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:47:48.2822814Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:47:48.2896205Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T10:47:48.3102344Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T10:47:48.3121687Z packages/game-logic test: [2m   Start at [22m 10:47:45
2026-05-14T10:47:48.3323055Z packages/game-logic test: [2m   Duration [22m 2.43s[2m (transform 247ms, setup 0ms, import 450ms, tests 88ms, environment 2ms)[22m
2026-05-14T10:47:48.3562576Z packages/game-logic test: Done
2026-05-14T10:47:48.4045931Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T10:47:48.6885264Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T10:47:48.8418454Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:49.0021343Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:47:49.1574852Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:47:49.1576798Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T10:47:49.1578598Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T10:47:49.1579911Z packages/protocol test: [2m   Start at [22m 10:47:48
2026-05-14T10:47:49.1582370Z packages/protocol test: [2m   Duration [22m 743ms[2m (transform 118ms, setup 0ms, import 216ms, tests 30ms, environment 0ms)[22m
2026-05-14T10:47:49.1841092Z packages/protocol test: Done
2026-05-14T10:47:49.1846835Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T10:47:49.1849309Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T10:47:49.7387172Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T10:47:49.7585707Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T10:47:50.7833086Z apps/server test: {"level":30,"time":1778755670778,"pid":5792,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T10:47:50.7872566Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 722[2mms[22m[39m
2026-05-14T10:47:50.7892439Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 592[2mms[22m[39m
2026-05-14T10:47:51.6800107Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T10:47:51.6813071Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T10:47:51.7654317Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 244[2mms[22m[39m
2026-05-14T10:47:51.9823146Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 64[2mms[22m[39m
2026-05-14T10:47:52.8944041Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T10:47:52.8946137Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ur95wZ/rebno.db
2026-05-14T10:47:52.8947708Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:47:52.8948855Z apps/server test: [run-migrations] OK
2026-05-14T10:47:52.9041463Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T10:47:52.9043107Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-dc0QUF/rebno.db
2026-05-14T10:47:52.9044098Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:47:52.9045663Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T10:47:52.9046791Z apps/server test: [run-migrations] OK
2026-05-14T10:47:52.9119736Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:47:52.9142174Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1fTn9s/rebno.db
2026-05-14T10:47:52.9143505Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:47:52.9144353Z apps/server test: [run-migrations] OK
2026-05-14T10:47:52.9152329Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:47:52.9154391Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1fTn9s/rebno.db
2026-05-14T10:47:52.9192027Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:47:52.9240754Z apps/server test: [run-migrations] OK
2026-05-14T10:47:52.9242289Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 51[2mms[22m[39m
2026-05-14T10:47:52.9843679Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 166[2mms[22m[39m
2026-05-14T10:47:53.2213030Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T10:47:53.4964151Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T10:47:53.7545614Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:47:54.0633033Z apps/server test: {"level":40,"time":1778755674059,"pid":5903,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:47:54.0699529Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:47:54.0742442Z apps/server test: {"level":40,"time":1778755674063,"pid":5903,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:47:54.0780203Z apps/server test: {"level":40,"time":1778755674064,"pid":5903,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:47:54.2083996Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 127[2mms[22m[39m
2026-05-14T10:47:54.3163211Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:47:54.6032874Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:47:55.3949613Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 110[2mms[22m[39m
2026-05-14T10:47:55.4118637Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T10:47:55.4140271Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ multiple files { path: ['.env.local', '.env'] }
2026-05-14T10:47:55.4142123Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T10:47:56.2183441Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:47:56.4566677Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:47:56.4632114Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T10:47:56.4692014Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T10:47:56.4711743Z apps/server test: [2m   Start at [22m 10:47:49
2026-05-14T10:47:56.4713293Z apps/server test: [2m   Duration [22m 6.71s[2m (transform 487ms, setup 0ms, import 3.41s, tests 938ms, environment 4ms)[22m
2026-05-14T10:47:56.5172044Z apps/server test: Done
2026-05-14T10:47:56.5301913Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 106[2mms[22m[39m
2026-05-14T10:47:57.2387952Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 68[2mms[22m[39m
2026-05-14T10:47:57.9245480Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 40[2mms[22m[39m
2026-05-14T10:47:58.6044155Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-14T10:47:59.2710313Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-14T10:47:59.9307202Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:48:00.6184393Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T10:48:01.3633852Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:48:02.0299670Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:48:02.6829499Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:48:03.3343308Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:48:04.0068405Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:48:04.6639677Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:48:05.3252680Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:48:05.9925408Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:48:06.6502184Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:48:07.3145282Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:48:07.9929117Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:48:08.6509292Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:48:09.2933544Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:48:09.9779583Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:48:10.6382086Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-14T10:48:10.6592618Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T10:48:10.6612297Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T10:48:10.6614575Z apps/client test: [2m   Start at [22m 10:47:49
2026-05-14T10:48:10.6617993Z apps/client test: [2m   Duration [22m 20.90s[2m (transform 798ms, setup 57ms, collect 1.23s, tests 1.03s, environment 12.25s, prepare 2.31s)[22m
2026-05-14T10:48:10.7936321Z apps/client test: Done
2026-05-14T10:48:10.8008459Z 
2026-05-14T10:48:10.8008760Z verify-phase-5: OK (7 steps green)
